/*
 * @Author: mark
 * @Date: 2023-08-16 13:24:22
 * @LastEditors: mark 
 * @LastEditTime: 2023-12-05 07:16:44
 * @FilePath: /pdd/ruoyi-egg/app/controller/system/sysMenu.js
 * @Description:
 *
 * Copyright (c) 2023 by ${git_name_email}, All Rights Reserved.
 */
const Controller = require("egg").Controller;

// 定义请求接口的请求参数规则
const queryRule = {
  component: { type: "string", required: false },
  createBy: { type: "string", required: false },
  createTime: { type: "string", required: false },
  icon: { type: "string", required: false },
  isCache: { type: "string", required: false },
  isFrame: { type: "string", required: false },
  menuId: { type: "string", required: false },
  menuName: { type: "string", required: false },
  menuType: { type: "string", required: false },
  orderNum: { type: "string", required: false },
  parentId: { type: "string", required: false },
  path: { type: "string", required: false },
  perms: { type: "string", required: false },
  query: { type: "string", required: false },
  remark: { type: "string", required: false },
  status: { type: "string", required: false },
  updateBy: { type: "string", required: false },
  updateTime: { type: "string", required: false },
  visible: { type: "string", required: false },
};

/**
 * @Controller 菜单权限
 */
class SysMenuController extends Controller {
  /**
   * 普通分页查询
   * @param {*} ctx
   */
  /**
   * @summary 获取菜单列表  
   * @description 获取菜单列表  
   * @Router get /system/menu/list
   * @request query string pageNum 页码 默认 1
   * @request query string pageSize 单页数量 默认 10
   * @request query string component 组件路径
   * @request query string createBy 创建者
   * @request query string createTime 创建时间
   * @request query string icon 菜单图标
   * @request query string isCache 是否缓存（0缓存 1不缓存）
   * @request query string isFrame 是否为外链（0是 1否）
   * @request query string menuId 菜单ID
   * @request query string menuName 菜单名称
   * @request query string menuType 菜单类型（M目录 C菜单 F按钮）
   * @request query string orderNum 显示顺序
   * @request query string parentId 父菜单ID
   * @request query string path 路由地址
   * @request query string perms 权限标识
   * @request query string query 路由参数
   * @request query string remark 备注
   * @request query string status 菜单状态（0正常 1停用）
   * @request query string updateBy 更新者
   * @request query string updateTime 更新时间
   * @request query string visible 菜单状态（0显示 1隐藏）
   * @response 200 SystemMenuList 操作成功
   */
  async list(ctx) {
    ctx.validate(queryRule, ctx.request.query);
    ctx.body = await ctx.service.system.sysMenu.list(ctx.request.query);
    ctx.status = 200;
  }

  /**
   * 获取列表数据
   * @param {*} ctx
   */
  async allList(ctx) {
    ctx.body = await ctx.service.system.sysMenu.allList(ctx.request.query);
    ctx.status = 200;
  }

  /**
   * 删除
   * @param {*} ctx
   */
  /**
   * @summary 菜单权限表删除  
   * @description 菜单权限表删除  
   * @Router delete /system/menu/{menuId}
   * @response 200   操作成功
   */
  async delete(ctx) {
    ctx.body = await ctx.service.system.sysMenu.delete(ctx.params.menuId);
    ctx.status = 200;
  }

  /**
   * 更新
   * @param {*} ctx
   */
  /**
   * @summary 菜单权限表修改  
   * @description 菜单权限表修改  
   * @Router put /system/menu
   * @response 200   操作成功
   */
  async update(ctx) {
    ctx.body = await ctx.service.system.sysMenu.update(ctx.request.body);
    ctx.status = 200;
  }

  /**
   * 获取详情
   * @param {*} ctx
   */
  /**
   * @summary 菜单权限表详情  
   * @description 菜单权限表详情  
   * @Router get /system/menu/{menuId}
   * @request query string component 组件路径
   * @request query string createBy 创建者
   * @request query string createTime 创建时间
   * @request query string icon 菜单图标
   * @request query string isCache 是否缓存（0缓存 1不缓存）
   * @request query string isFrame 是否为外链（0是 1否）
   * @request query string menuId 菜单ID
   * @request query string menuName 菜单名称
   * @request query string menuType 菜单类型（M目录 C菜单 F按钮）
   * @request query string orderNum 显示顺序
   * @request query string parentId 父菜单ID
   * @request query string path 路由地址
   * @request query string perms 权限标识
   * @request query string query 路由参数
   * @request query string remark 备注
   * @request query string status 菜单状态（0正常 1停用）
   * @request query string updateBy 更新者
   * @request query string updateTime 更新时间
   * @request query string visible 菜单状态（0显示 1隐藏）
   * @response 200   操作成功
   */
  async detail(ctx) {
    if (ctx.params.menuId == "treeselect") {
      ctx.body = await ctx.service.system.sysMenu.getAllRoute();
      ctx.status = 200;
    } else {
      ctx.validate(queryRule, ctx.request.query);
      ctx.body = await ctx.service.system.sysMenu.detail(ctx.params.menuId);
      ctx.status = 200;
    }
  }

  /**
   * 创建
   * @param {*} ctx
   */
  /**
   * @summary 菜单权限表新增  
   * @description 菜单权限表新增  
   * @Router post /system/menu
   * @response 200   操作成功
   */
  async create(ctx) {
    ctx.body = await ctx.service.system.sysMenu.create(ctx.request.body);
    ctx.status = 200;
  }

  /**
   * 查询权限下的菜单
   * @param {*} ctx
   */
  /**
   * @summary 查询用户对应的菜单权限  
   * @description 查询用户对应的菜单权限  
   * @Router get /system/menu/roleMenuTreeselect/{roleId}
   * @response 200 SystemMenuRolemenutreeselect 操作成功
   */
  async roleMenuTreeselect(ctx) {
    ctx.body = await ctx.service.system.sysMenu.roleMenuTreeselect(
      ctx.params.roleId
    );
    ctx.status = 200;
  }

  /**
   * @summary 菜单权限表导出  
   * @description 菜单权限表导出  
   * @Router post /system/sysMenu/export
   * @response 200   操作成功
   */
  async downLoad(ctx) {
    let data = await ctx.service.system.sysMenu.allList(ctx.request.body);
    let downLoadModule = ctx.model.SysMenu.fieldRawAttributesMap;
    let columnData = [];
    for (var key in downLoadModule) {
      columnData.push({
        header: downLoadModule[key].comment,
        key: ctx.underlineToHump(key),
        width: 15,
      });
    }
    if (data.code == 200) {
      await ctx.service.exportExcel.publicDownLoad(columnData, data.data);
    } else {
      ctx.body = data;
      ctx.status = 200;
    }
  }
}

module.exports = SysMenuController;
